/*
 * ComponenteGenerado.java	 
 *
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 07/10/10, 09:12:38 AM
 */

package com.ufps.cuatro.modelo.representacion.componente;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.modelo.biblioteca.ItemStaticListModelObject;
import com.ufps.cuatro.modelo.biblioteca.StaticListModelObject;
import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.representacion.ParametroPropiedad;
import com.ufps.cuatro.modelo.representacion.Propiedad;
import com.ufps.cuatro.modelo.representacion.PropiedadBeans;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.base.PropiedadBase;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextLine;
import com.ufps.cuatro.util.generadores.codeobject.CodeProcessStaticModelString;
import com.ufps.cuatro.util.generadores.codeobject.EnumTypeCodeSyntax;

/**
 * <i><b>ComponenteGenerado:</b></i><p>Esta Clase permite generar representaciones 
 * simples de los Controles swing soportados en la Aplicación.</p>
 * <p>Una Representación Simple, es la forma más sencilla de crear un Control swing
 * en la Interfaz, con el mínimo de Propiedades y Opciones de Distribución Configuradas.
 * Los Objetos de esta Clase son utilizados como apoyo y Soporte para otro tipo
 * de Componentes y su existencia en el Proceso de Creación o Representación del
 * Modelo Analizado, depende de otros Componente que puedan Contenerlos.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 07/10/10
 * @see Componente 
 */
public class ComponenteGenerado extends Componente implements CodeProcessStaticModelString{
    private static final long serialVersionUID = 805475390121413396L;   
    
    private int idClaseComponenteGenerado;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGenerado;
     /**
     * <p>Representa la Propiedad Beans del Control Swing.</p>
     * <p>Una Propiedad Beans es una Propiedad que se utilizará
     * para identificar el tipo de dato que devolverá el control por
     * defecto. Por ejemplo si representa un JTextField su Propiedad
     * Beans será el getText() y esta propiedad devolverá un String.
     * En Componentes Distribuidores complejos la colección de su contenido
     * tendra grupos de estas propiedad la cuales podran generar un
     * Beans con los tipos de datos que soportan.</p>
     */
    protected PropiedadBase objPropiedadBase;  
    private PropiedadBeans objPropiedadBeans;   
    private StaticListModelObject objStaticListModelObject;    
    
    /**
     * Contructor utilizado en la Implementación.
     * @param objComponenteBase Define el Control que se utilizará en la representación.
     * @param heredado Determina la herencia en la representación.
     * @param previsualizar Determina si la representación soportará vistas previas.
     */
    public ComponenteGenerado(ComponenteBaseStandar objComponenteBase, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, true, true);
        this.heredado = heredado;
        this.previsualizar = previsualizar;
        try{
            int idPropiedadBeans = objComponenteBase.getIdPropiedadComponenteBeans();
            this.objPropiedadBase = GeneradorComponentes.objPropiedadesBase.get(idPropiedadBeans);
            this.objPropiedadBeans = new PropiedadBeans(this, objPropiedadBase);        

            this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.generado"); 
            if(!heredado){
                this.idClaseComponenteGenerado = (!previsualizar) ?
                        ComponenteGenerado.serialIdComponenteGenerado++ :
                        ComponenteGenerado.serialIdComponenteGenerado;        
            }
            addSwap("package", "gui");
        }catch(java.lang.NullPointerException ex){
        }        
    }

    /**
     * Devuelve el Id de Generación del Componente Generado.
     * @return Id de Generación del Componente Generado.
     */
    public int getIdClaseComponenteGenerado() {
       try{
            return idClaseComponenteGenerado;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }      
    
    /**
     * Devuelve la Propiedad Utilizada para la Representación Beans del Control Swing.
     * @return Propiedad Utilizada para la Representación Beans del Control Swing.
     */
    public PropiedadBase getObjPropiedadBase() {
       try{
            return objPropiedadBase;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }

    /**
     * Devuelve la Propiedad Beans para la Representación Beans del Control Swing.
     * @return Propiedad Beans para la Representación Beans del Control Swing.
     */
    public PropiedadBeans getObjPropiedadBeans() {
        return objPropiedadBeans;
    }

    /**
     * Establece la Propiedad Utilizada para la Representación Beans del Control Swing.
     * @param objPropiedadBase Propiedad Utilizada para la Representación Beans del Control Swing.
     */
    public void setObjPropiedadBase(PropiedadBase objPropiedadBase) {        
        this.objPropiedadBase = objPropiedadBase;
    }

    @Override
    public String toString() {
       try{
            if(this.eBiblioteca == TipoBiblioteca.eSwap) {
                return this.objClassSwing.getSimpleName() + "BS" + dni + this.idClaseComponenteGenerado;
            }
            else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
                return this.objClassSwing.getSimpleName() + "BL" + dni + this.idClaseComponenteGenerado;
            }
            else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
                return this.objClassSwing.getSimpleName() + "BG" + dni + this.idClaseComponenteGenerado;
            }
            else if(this.getObjPropiedadesDisponibles() != null){            
                //se evalua si la propiedad name ha sido inicializada
                if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                    return this.getName();
                }
            }
            return this.objClassSwing.getSimpleName() + dni + this.idClaseComponenteGenerado;
        }catch(java.lang.NullPointerException ex){}
           return "";
    }
    
    @Override
    protected Object clone() {
       try{
            ComponenteGenerado objClon;
            //Primero se Clona la Referencia Local
            objClon = (ComponenteGenerado) super.clone();
            //Ahora se hace la Clonación Profunda        
            ((ComponenteGenerado)objClon).setObjPropiedadBase(objPropiedadBase);
            return objClon;
       }catch(java.lang.NullPointerException ex){}
       return null;
    }

    @Override
    public int compareTo(Object o) {
       try{
        ComponenteGenerado obj = (ComponenteGenerado) o;
        if(this.idClaseComponenteGenerado > obj.idClaseComponenteGenerado) {
            return 1;
        }
        else if(this.idClaseComponenteGenerado < obj.idClaseComponenteGenerado) {
            return -1;
        }
        else {
            return 0;
        }
    }catch(java.lang.NullPointerException ex){}
       return 0;
    }

    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGenerado = ComponenteGenerado.serialIdComponenteGenerado++;     
            this.previsualizar = false;
        }
    }

    @Override
    protected void actualizarGridBagConstraintsActiva() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Devuelve la Referecnia del Modelo Estático asociado a la Representación.
     * @return Referecnia del Modelo Estático asociado a la Representación.
     */
    public StaticListModelObject getStaticListModelString() {
       try{
        return objStaticListModelObject;
        }catch(java.lang.NullPointerException ex){}
       return null;
    }

    /**
     *  Establece la Referecnia del Modelo Estático asociado a la Representación.
     * @param staticListModelString Referecnia del Modelo Estático asociado a la Representación.
     */
    public void setStaticListModelString(StaticListModelObject staticListModelString) {
        this.objStaticListModelObject = staticListModelString;
    }
    
    /**
     * Determina si el <code>Componente</code> represente un Control que soporte
     * Colecciones que permitan almacenar Modelos Estáticos de Cadenas de Texto.
     * @return boolean que determina si el <code>Componente</code> represente un Control que soporte
     * Colecciones que permitan almacenar Modelos Estáticos de Cadenas de Texto.
     */
    public boolean isContainsStaticListModelString(){
        return !(objStaticListModelObject == null);
    }

    @Override
    public ArrayList<CodeContextLine> generateSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        try{
            ArrayList<CodeContextLine> objSourceLinesCode = new ArrayList<CodeContextLine>();        
            if(eTypeCodeSintax == EnumTypeCodeSyntax.eMethodsDefinitionProperties){
                generateSourceCodeSyntaxCollectionProperties(true);
            }                
            return objSourceLinesCode;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteGenerado.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }    

    @Override
    public CodeContextLine generateSingleSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {        
        if(eTypeCodeSintax == EnumTypeCodeSyntax.eImport){
            return generateSourceCodeSyntaxImport();
        }                
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eDefinitionCanonical){
            return generateSourceCodeSyntaxDefinition(true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eDefinitionSimple){
            return generateSourceCodeSyntaxDefinition(false);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eInitializationCanonical){
            return generateSourceCodeSyntaxInitialization(true);
        }
        else if(eTypeCodeSintax == EnumTypeCodeSyntax.eInitializationSimple){
            return generateSourceCodeSyntaxInitialization(false);
        }        
        return null;
    }      
    
    public CodeContextLine generateSourceCodeSintaxDefinitionStaticListModel(){        
        try{
            String strDefinicion;
            Object[] items = objStaticListModelObject.getObjItems().toArray();
            if(items.length > 0){
                strDefinicion = "private String[] items" + getName() + " = {";
                for(Object item : items){
                    if(item instanceof ItemStaticListModelObject){
                        ItemStaticListModelObject objItem = (ItemStaticListModelObject) item;
                        String strItem = "\"" + objItem.getName() + "\",";
                        strDefinicion += strItem;
                    }
                }
                strDefinicion = strDefinicion.substring(0, strDefinicion.length() - 2);
                strDefinicion += "\"};";
                CodeContextLine objSourceLineCode = new CodeContextLine(strDefinicion);
                return objSourceLineCode;            
            }
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(ComponenteGenerado.class.getName()).log(Level.SEVERE, null, ex);
        }                
        return null;
    }    
    
    public CodeContextLine generateSourceCodeSintaxInitializationWithStaticModelString(){        
        try{
            String strDefinicion = "";        
            if(getStaticListModelString() != null && getStrClassPath().equals("javax.swing.JComboBox")){
                strDefinicion = getName() + " = new " + getStrClassPath() + "(items" + getName() + ");";
            }               
            CodeContextLine objSourceLineCode = new CodeContextLine(strDefinicion);
            return objSourceLineCode;            
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(ComponenteGenerado.class.getName()).log(Level.SEVERE, null, ex);
        }                
        return null;
    }
    
    public boolean existsResourceImage(){  
        if(incluido){
            Propiedad objPropiedad = findPropiedadForAlias("Icono");
            if(objPropiedad != null){            
                ParametroPropiedad objParametro = objPropiedad.getObjParametroDefault(Propiedad.MODO_SET);
                if(objParametro.getStrValue() != null){
                   if(!objParametro.getStrValue().isEmpty()){
                       return true;
                   } 
                }            
            }        
        }
        return false;
    }
    
    
}